package org.icsdt.sp.service;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.icsdt.sp.domain.*;

import android.util.Log;

import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.stmt.QueryBuilder;

public class BDService {
    private static final String TAG = "BDService";
    private static final boolean LOG_ON = true;


    //PERITOS
    public static List<Perito> getPeritos() throws SQLException{
	List<Perito> listaPerito = (List<Perito>)(List<?>) DatabaseHelper.getInstance().getDao("Perito").queryForAll();
	if (LOG_ON) {
	    Log.d(TAG,"Obtendo Lista de Peritos (Banco de Dados)");
	}
	return listaPerito;
    }

    //EQUIPE
    public static List<Equipe> getEquipes(int secao_id) throws SQLException{
	List<Equipe> listaEquipe = (List<Equipe>)(List<?>) DatabaseHelper.getInstance().getDao("Equipe").queryForEq("secao_id", secao_id);
	if (LOG_ON) {
	    Log.d(TAG,"Obtendo Equipes (Banco de Dados)");
	}
	return listaEquipe;
    }

    //MEMORANDO
    public static List<Memorando> getMemorandos() throws SQLException{
	List<Memorando> listaMemorando = (List<Memorando>)(List<?>) DatabaseHelper.getInstance().getDao("Memorando").queryForAll();
	if (LOG_ON) {
	    Log.d(TAG,"Obtendo Memorandos (Banco de Dados)");
	}
	return listaMemorando;
    }

    //MILLENIUM
    public static List<Millenium> getMilleniuns(String tipo) throws SQLException{
	QueryBuilder<IEntidade, Integer> queryBuilder = DatabaseHelper.getInstance().getDao("Solicitacao").queryBuilder();
	queryBuilder.where().like(Solicitacao.TIPO, tipo);
	List<Millenium> listaMillenium = (List<Millenium>)(List<?>) DatabaseHelper.getInstance().getDao("Millenium").queryBuilder().join(queryBuilder).query();

	if (LOG_ON) {
	    Log.d(TAG,"Obtendo Milleniuns (Banco de Dados)");
	}
	return listaMillenium;
    }

    //---------------REGISTRO-------------------------------------------------

    //Obter registro OK
    public static String getReg(String chave) {

	String retorno = "";
	try {
	    Registro reg = (Registro) DatabaseHelper.getInstance().getDao("Registro").queryBuilder().where().eq("chave",chave).queryForFirst();
	    if (reg != null) retorno = reg.valor; 
	    if (LOG_ON) Log.d(TAG,"Obtendo Registro (Banco de Dados) " + retorno);
	} catch (SQLException e) {Log.e(TAG,"Erro no Banco de Dados",e);}
	return retorno;
    }

    //------------------- USADO APENAS PELO HttpService ---------------------------------------------------------------

    //Atualizar registro OK
    public static void setReg(String chave,String valor) throws SQLException {
	if (LOG_ON) Log.d(TAG,"Atualizando Registro (Banco de Dados) " + chave + " : " + valor);
	Registro reg = (Registro) DatabaseHelper.getInstance().getDao("Registro").queryBuilder().where().eq("chave",chave).queryForFirst();
	if (reg == null) DatabaseHelper.getInstance().getDao("Registro").create(new Registro(chave,valor));
	else {
	    reg.valor=valor;
	    DatabaseHelper.getInstance().getDao("Registro").update(reg);
	}

    }

    //Atualizar registro OK
    public static void unsetReg(String chave) throws SQLException {
	if (LOG_ON) Log.d(TAG,"Apagando Registro (Banco de Dados) " + chave);
	Registro reg = (Registro) DatabaseHelper.getInstance().getDao("Registro").queryBuilder().where().eq("chave",chave).queryForFirst();
	if (reg != null) {
	    reg.valor="";
	    DatabaseHelper.getInstance().getDao("Registro").update(reg);
	}
    }



    //---------------MENSAGEM---------------

    //Listar mensagens
    public static List<Mensagem> getListaMensagem() throws SQLException {
	List<Mensagem> listaMensagem= new ArrayList<Mensagem>();
	Dao<IEntidade, Integer> dao = DatabaseHelper.getInstance().getDao("Mensagem");
	List<IEntidade> listaEntidade = dao.queryForAll();
	if (listaEntidade != null ) for (IEntidade entidade : listaEntidade) listaMensagem.add((Mensagem) entidade);
	if (LOG_ON) {
	    Log.d(TAG,"Obtendo Lista de Mensagens (Banco de Dados)");
	}
	return listaMensagem;
    }

    //Deletar uma mensagem
    public static void deletaMensagem(int id) throws SQLException {
	DatabaseHelper.getInstance().getDao("Mensagem").deleteById(id);	
	if (LOG_ON) {
	    Log.d(TAG,"Deletando Mensagem (Banco de Dados)");
	}
    }

    //Adicionar uma mensagem
    public static void setMensagem(String msg) throws SQLException {
	DatabaseHelper.getInstance().getDao("Mensagem").create(new Mensagem(msg));
	if (LOG_ON) {
	    Log.d(TAG,"Adicionando Mensagem (Banco de Dados)");
	}
    }

    public static void insereEntidade(String classe, IEntidade entidade) throws SQLException {
	DatabaseHelper.getInstance().getDao(classe).create(entidade);
    }

    public static void deletaEntidade(String classe, int id) throws SQLException {
	DatabaseHelper.getInstance().getDao(classe).deleteById(id);
    }

    public static void updateEntidade(String classe, IEntidade entidade, int id) throws SQLException {
	DatabaseHelper.getInstance().getDao(classe).updateId(entidade, id);
    }

    //SECAO
    public static void loadSecao(Secao secao) {
	try {
	    DatabaseHelper.getInstance().getDao("Secao").refresh(secao);
	} catch (SQLException e) {
	    // TODO Auto-generated catch block
	    e.printStackTrace();
	}
	if (LOG_ON) {
	    Log.d(TAG,"Refreshing Secao (Banco de Dados)");
	}
    }

    //SOLICITACAO
    public static void loadSolicitacao(Solicitacao solicitacao) {
	try {
	    DatabaseHelper.getInstance().getDao("Solicitacao").refresh(solicitacao);
	} catch (SQLException e) {
	    // TODO Auto-generated catch block
	    e.printStackTrace();
	}
	if (LOG_ON) {
	    Log.d(TAG,"Refreshing Secao (Banco de Dados)");
	}
    }	

    //OCORRENCIA
    public static void loadOcorrencia(Ocorrencia ocorrencia) {
	try {
	    DatabaseHelper.getInstance().getDao("Ocorrencia").refresh(ocorrencia);
	} catch (SQLException e) {
	    // TODO Auto-generated catch block
	    e.printStackTrace();
	}
	if (LOG_ON) {
	    Log.d(TAG,"Refreshing Secao (Banco de Dados)");
	}
    }	


}
